package com.chat.websocket.online;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.log4j.Logger;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketSession;

import com.chat.vo.params.OnlinePeopleVo;

/**
 * 在线用户信息管理
 * 
 * @author lwh
 *
 */
public final class OnlineManage {
	private static final Logger logger = Logger.getLogger(OnlineManage.class);

	// 准备连接的用户信息集( 预备连接集 )
	private static final ConcurrentHashMap<String, String> PlanConnTemp = new ConcurrentHashMap<String, String>();

	// 用户连接在线信息集( 在线栈 )
	private static final ConcurrentHashMap<String, OnlinePeopleVo> OnlineUserSetMap = new ConcurrentHashMap<String, OnlinePeopleVo>();

	/**
	 * 将用户信息添加到预备集中
	 * 
	 * @param userName
	 * @param token
	 * @return 添加成功返回true，反之false
	 */
	public static final void addToPlanConnTemp(String userName, String token) {
		logger.info("用户 " + userName + " 加入 预备连接集 ");
		if (null == PlanConnTemp.get(userName)) {
			PlanConnTemp.put(userName, token);
		} else {
			PlanConnTemp.remove(userName, token);
			PlanConnTemp.put(userName, token);
		}
	}

	/**
	 * 判断用户信息在预备集是否存在
	 * 
	 * @param userName
	 * @param token
	 * @return 存在返回 true ，反之 false
	 */
	public static final boolean isExistInPlanConnTemp(String userName, String token) {
		logger.info("判断用户信息在预备集是否存在");
		String temp = null;
		if (null != (temp = PlanConnTemp.get(userName))) {
			if (token.equals(temp)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 移除预备集用户信息
	 * 
	 * @param userName
	 * @param token
	 * @return
	 */
	public static final boolean removeInPlanConnTemp(String userName, String token) {
		logger.info("移除预备集用户 " + userName + " 信息");
		return PlanConnTemp.remove(userName, token);
	}

	/**
	 * 把登陆用户信息添加到“在线栈”
	 * 
	 * @param opv
	 * @return
	 */
	public static final boolean addToOnlineUserList(OnlinePeopleVo opv) {
		logger.info("把登陆用户 " + opv.getUserName() + " 的信息添加到“在线栈”");
		// 判断“在线栈”是否存在当前登录用户
		if (null == OnlineUserSetMap.get(opv.getUserName())) {
			OnlineUserSetMap.put(opv.getUserName(), opv);
			return true;
		}
		return false;
	}

	/**
	 * 判断用户是否在线
	 * 
	 * @param userName
	 * @return
	 */
	public static final boolean isOnlined(String userName) {
		logger.info("判断用户: " + userName + "是否在线");
		return null != OnlineUserSetMap.get(userName);
	}

	/**
	 * 获取指定的在线用户
	 * 
	 * @param userName
	 * @return
	 */
	public static final OnlinePeopleVo getOnlineUser(String userName) {
		logger.info("获取指定的在线用户：" + userName);
		return OnlineUserSetMap.get(userName);
	}

	/**
	 * 移除在线用户<br>
	 * 使用userName正常退出，并移除在线信息的，默认使用CloseStatus.NORMAL关闭编号
	 * 
	 * @param userName
	 * @throws IOException
	 */
	public static final void removeOnlineUser(String userName) throws IOException {
		logger.info("移除在线用户：" + userName);
		// 正常通过userName关闭会话已消除在线信息，无需再进行在线消除
		OnlineUserSetMap.get(userName).getSession().close(CloseStatus.NORMAL);
		OnlineUserSetMap.remove(userName);
	}

	/**
	 * 移除在线用户<br>
	 * 使用session正常退出，并移除在线信息的，不允许使用CloseStatus.NORMAL关闭编号<br>
	 * 请使用CloseStatus.GOING_AWAY关闭编号
	 * 
	 * @param session
	 * @param code
	 * @throws IOException
	 */
	public static final void removeOnlineUser(WebSocketSession session, CloseStatus code) throws IOException {
		logger.info("关闭在线session, 关闭编码: " + code.getCode());
		// 正常通过userName关闭会话已消除在线信息，无需再进行在线消除
		if (code.equalsCode(CloseStatus.NORMAL)) {
			return;
		}
		for (OnlinePeopleVo temp : OnlineUserSetMap.values()) {
			if (temp.getSession() == session) {
				logger.info("移除用户 "+ temp.getUserName() +" 在线session");
				OnlineUserSetMap.remove(temp.getUserName(), temp);
			}
		}
	}

	// （可添加其余获取在线用户信息的业务）未完待续。。。

}
